package com.itheima.service.Impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.POJO.Food;
import com.itheima.POJO.HealthScheme;
import com.itheima.POJO.Sport;
import com.itheima.POJO.Template;
import com.itheima.dao.TemplateMapper;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.service.TemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @auther zhaorui
 * @date 2019-12-05 - 16:06
 */
@Service(interfaceClass = TemplateService.class)
@Transactional
public class TemplateServiceImpl implements TemplateService {

    @Autowired
    private TemplateMapper templateMapper;


    /**
     * 以map形式将与healthscheme的数据封装 并插入到相关表中
     * @param templateId
     * @param healthIds
     */
    @Override
    public void setTemplateAndHealthScheme(Integer templateId, Integer[] healthIds) {
        if (healthIds != null && healthIds.length > 0) {
            for (Integer healthId : healthIds) {
                Map<String, Integer> map = new HashMap<>();
                map.put("templateId", templateId);
                map.put("healthId", healthId);
                templateMapper.setTemplateAndHealthScheme(map);
            }
        }
    }


    /**
     * 以map形式将与food的数据封装 并插入到相关表中
     * @param templateId
     * @param foodIds
     */
    @Override
    public void setTemplateAndFood(Integer templateId, Integer[] foodIds) {
        if (foodIds != null && foodIds.length > 0) {
            for (Integer foodId : foodIds) {
                Map<String, Integer> map = new HashMap<>();
                map.put("templateId", templateId);
                map.put("foodId", foodId);
                templateMapper.setTemplateAndFood(map);
            }
        }
    }

    /**
     * 以map形式将与sport的数据封装 并插入到相关表中
     * @param templateId
     * @param sportIds
     */
    @Override
    public void setTemplateAndSport(Integer templateId, Integer[] sportIds) {
        if (sportIds != null && sportIds.length > 0) {
            for (Integer sportId : sportIds) {
                Map<String, Integer> map = new HashMap<>();
                map.put("templateId", templateId);
                map.put("sportId", sportId);
                templateMapper.setTemplateAndSport(map);
            }
        }
    }

    /**
     * 根据id查询template的内容
     * @param id
     * @return
     */
    @Override
    public Template findTemplateById(Integer id) {
        return templateMapper.findTemplateById(id);
    }

    /**
     * 查询与当前template对象相关联的sport的复选框集合
     * @param id
     * @return
     */
    @Override
    public List<Integer> findTemplateAndSportByTemplateId(Integer id) {
        List<Integer> sportIds = templateMapper.findTemplateAndSportByTemplateId(id);
        return sportIds;
    }

    /**
     * 查询与当前template对象相关联的food的复选框集合
     * @param id
     * @return
     */
    @Override
    public List<Integer> findTemplateAndFoodByTemplateId(Integer id) {
        List<Integer> foodIds = templateMapper.findTemplateAndFoodByTemplateId(id);
        return foodIds;
    }

    /**
     * 查询与当前template对象相关联的healthscheme的复选框集合
     * @param id
     * @return
     */
    @Override
    public List<Integer> findTemplateAndHealthByTemplateId(Integer id) {
        List<Integer> heathIds = templateMapper.findTemplateAndHealthByTemplateId(id);
        return heathIds;
    }

    /**
     * 编辑
     * @param template
     * @param healthIds
     * @param foodIds
     * @param sportIds
     */
    @Override
    public void edit(Template template, Integer[] healthIds, Integer[] foodIds, Integer[] sportIds) {
        //首先修改 template
        templateMapper.edit(template);
        Integer templateId = template.getId();
        //删除与templateId相关的关联表内容
        templateMapper.deleteAssociation4Health(templateId);
        templateMapper.deleteAssociation4Food(templateId);
        templateMapper.deleteAssociation4Sport(templateId);
        //调用本类中的setTemplateAndHealthScheme等方法
        setTemplateAndHealthScheme(templateId, healthIds);
        setTemplateAndFood(templateId, foodIds);
        setTemplateAndSport(templateId, sportIds);

    }

    /**
     * 删除
     * @param id
     * @throws RuntimeException
     */
    @Override
    public void delete(Integer id) throws RuntimeException {
        //要删除多表关联的 数据
        //删除之前 先查询 是否和其他表存在关联  如果存在关联 则不能删除
        //1. 首先根据id查询 相关联的表 是否存在 多对多的 关系
        long countHealth2Template = templateMapper.findAssociation4Health(id);
        long countFood2Template = templateMapper.findAssociation4Food(id);
        long countSport2Template = templateMapper.findAssociation4Sport(id);

        if (countFood2Template > 0 || countHealth2Template > 0 || countSport2Template > 0){
            throw new RuntimeException("当前模板和其他方案进行绑定 无法删除");
        }else {
            templateMapper.deleteByTemplateId(id);
        }
    }


    /**
     * 添加模板
     *
     * @param template
     */
    @Override
    public void add(Template template, Integer[] healthIds, Integer[] foodIds, Integer[] sportIds) {
        templateMapper.add(template);
        Integer templateId = template.getId();
        setTemplateAndHealthScheme(templateId, healthIds);
        setTemplateAndFood(templateId, foodIds);
        setTemplateAndSport(templateId, sportIds);


    }

    /**
     * 分页
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();

        //开启分页 
        PageHelper.startPage(currentPage, pageSize);
        Page<Template> page = templateMapper.findPageByQueryString(queryString);
        List<Template> rows = page.getResult();
        long total = page.getTotal();

        return new PageResult(total, rows);
    }

    /**
     * 启用/ 禁用
     *
     * @param id
     * @param status
     */
    @Override
    public void forbiddenById(Integer id, String status) {
        //判断前台传来的status  如果是 0 就转换为1 进行更新数据
        if ("1".equals(status)) {
            status = "0";
        } else {
            status = "1";
        }
        templateMapper.updateTemplateByStatus(id, status);
    }

    /**
     * 查询健康方案
     *
     * @return
     */
    @Override
    public List<HealthScheme> findAllHealth() {
        return templateMapper.findAllHealth();

    }

    /**
     * 查询运动方案
     *
     * @return
     */
    @Override
    public List<Sport> findAllSport() {
        return templateMapper.findAllSport();
    }

    /**
     * 查询膳食方案
     *
     * @return
     */
    @Override
    public List<Food> findAllFood() {
        return templateMapper.findAllFood();
    }
}
